/*
 * Copyright (c) 2024. hallele, Inc All rights reserved.
 */

package cn.hallele.ms.filecenter.api.controller;

import cn.hallele.infrastructure.metadata.io.R;
import cn.hallele.infrastructure.metadata.io.Response;
import cn.hallele.mc.sdk.filecenter.api.FileApi;
import cn.hallele.mc.sdk.filecenter.common.constants.ReqPathConst;
import cn.hallele.mc.sdk.filecenter.dto.FileDTO;
import cn.hallele.ms.filecenter.api.das.FileDBDas;
import cn.hallele.ms.infrastructure.auditlog.annotation.ApiLog;
import jakarta.validation.constraints.NotNull;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/**
 * hallele_ms_filecenter
 *
 * @author anle5
 * @since 2024/9/15 21:06
 */
@Slf4j
@RestController
@RequestMapping(ReqPathConst.FILE_V1)
public class FileController implements FileApi {
    @Autowired
    private FileDBDas fileDBDas;

    /**
     * 文件上传接口
     *
     * @param file 待上传的文件
     * @return 地址
     */
    @Override
    @ApiLog(id = "FILE_V1_UPLOAD_FILE")
    public Response<String> uploadFile(@RequestParam("file") MultipartFile file,
                                       @RequestParam("action") String action) {
        return R.ok(fileDBDas.uploadFile(FileDTO.builder().multipartFile(file).action(action).build()).getUrl());
    }

    /**
     * 删除文件
     *
     * @param id 文件id
     * @return 成功/失败
     */
    @Override
    @ApiLog(id = "FILE_V1_DELETE_FILE")
    public Response<Boolean> deleteFile(@RequestParam("id") Long id) {
        return null;
    }

    /**
     * 获取文件
     *
     * @param id 文件id
     * @return 文件url
     */
    @Override
    @ApiLog(id = "FILE_V1_GET_FILE")
    public Response<String> getFile(@RequestParam("id") Long id) {
        return R.ok(fileDBDas.getFileUrl(id));
    }

    /**
     * 获取文件的url路径，供前端下载/展示，但是有过期时间
     *
     * @param id      文件id
     * @param expires 过期时间
     * @return 文件url
     */
    @Override
    public Response<String> getUrlWithExpires(@RequestParam("id") Long id,
                                              @RequestParam("expires") Integer expires) {
        expires = expires == null ? -1 : expires;
        return R.ok(fileDBDas.getUrlWithExpires(id, expires));
    }

    /**
     * 获取图片的Base64
     *
     * @param id 文件id
     * @return 文件url
     */
    @Override
    public Response<String> getFileBase64(@NotNull Long id) {
        return null;
    }

    /**
     * 检查文件是否存在
     *
     * @param md5 md5值
     * @return 如果存在会返回文件信息，否则返回null
     */
    @Override
    @ApiLog(id = "FILE_V1_CHECK_EXIST")
    public Response<FileDTO> checkExist(@RequestParam("md5") String md5) {
        return R.ok(fileDBDas.checkExist(md5));
    }
}
